package com.pt25.service.sys.interfaces.facade.inner;

import com.pt25.base.model.security.aspect.PermissionCheck;
import com.pt25.base.res.ResBody;
import com.pt25.base.validator.CreateGroup;
import com.pt25.base.validator.UpdateGroup;
import com.pt25.service.sys.application.ConfigApp;
import com.pt25.service.sys.domain.config.service.ConfigDataService;
import com.pt25.service.sys.domain.config.service.ConfigLogService;
import com.pt25.service.sys.domain.config.service.ConfigTypeService;
import com.pt25.service.sys.domain.config.service.ConfigValueService;
import com.pt25.service.sys.interfaces.vo.config.ConfigDataVo;
import com.pt25.service.sys.interfaces.vo.config.ConfigLogVo;
import com.pt25.service.sys.interfaces.vo.config.ConfigTypeVo;
import com.pt25.service.sys.interfaces.vo.config.ConfigValueVo;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@Tag(
        name = "config inner api"
)
@RestController
@RequestMapping("/inner-api/sys")
public class ConfigInnerController {
    private static final String CONFIG_TYPE = "/config-type";

    private static final String CONFIG_DATA = "/config-data";

    private static final String CONFIG_VALUE = "/config-value";

    private static final String CONFIG_LOG = "/config-log";

    @Resource
    private ConfigApp configApp;

    @Resource
    private ConfigTypeService configTypeService;

    @Resource
    private ConfigDataService configDataService;

    @Resource
    private ConfigValueService configValueService;

    @Resource
    private ConfigLogService configLogService;


    @PermissionCheck("sys:config-type:add")
    @PostMapping(CONFIG_TYPE)
    public ResBody addConfigType(@RequestBody @Validated(CreateGroup.class) ConfigTypeVo configTypeVo) {
        configTypeVo.setId(null);
        long result = configTypeService.addConfigType(configTypeVo.toConfigType());
        return result > 0 ? ResBody.builder().build().ok() : ResBody.builder().build().fail();
    }

    @PermissionCheck("sys:config-type:del")
    @DeleteMapping(CONFIG_TYPE + "/{id}")
    public ResBody delConfigType(@PathVariable("id") Long id) {
        Boolean result = configApp.delConfigType(id);
        return result ? ResBody.builder().build().ok() : ResBody.builder().build().fail();
    }

    @PermissionCheck("sys:config-type:update")
    @PutMapping(CONFIG_TYPE)
    public ResBody updateConfigType(@RequestBody @Validated({UpdateGroup.class}) ConfigTypeVo configTypeVo) {
        boolean result = configTypeService.updateConfigType(configTypeVo.toConfigType());
        return result ? ResBody.builder().build().ok() : ResBody.builder().build().fail();
    }

    @PermissionCheck("sys:config-type:get")
    @GetMapping(CONFIG_TYPE + "/{id}")
    public ResBody getConfigType(@PathVariable("id") Long id) {
        return ResBody.builder().build().ok(configTypeService.getConfigType(id));
    }

    @PermissionCheck("sys:config-type:page")
    @PostMapping(CONFIG_TYPE + "/page")
    public ResBody pageConfigType(@RequestBody ConfigTypeVo configTypeVo) {
        return ResBody.builder().build().ok(configTypeService.pageConfigType(configTypeVo.toConfigType()));
    }


    @PermissionCheck("sys:config-data:add")
    @PostMapping(CONFIG_DATA)
    public ResBody addConfigData(@RequestBody @Validated(CreateGroup.class) ConfigDataVo configDataVo) {
        configDataVo.setId(null);
        long result = configApp.addConfigData(configDataVo.toConfigData());
        return result > 0 ? ResBody.builder().build().ok() : ResBody.builder().build().fail();
    }

    @PermissionCheck("sys:config-data:del")
    @DeleteMapping(CONFIG_DATA + "/{id}")
    public ResBody delConfigData(@PathVariable("id") long id) {
        Boolean result = configApp.delConfigData(id);
        return result ? ResBody.builder().build().ok() : ResBody.builder().build().fail();
    }

    @PermissionCheck("sys:config-data:update")
    @PutMapping(CONFIG_DATA)
    public ResBody updateConfigData(@RequestBody ConfigDataVo configDataVo) {
        boolean result = configApp.updateConfigData(configDataVo.toConfigData());
        return result ? ResBody.builder().build().ok() : ResBody.builder().build().fail();
    }

    @PermissionCheck("sys:config-data:get")
    @GetMapping(CONFIG_DATA + "/{id}")
    public ResBody getConfigData(@PathVariable("id") Long id) {
        return ResBody.builder().build().ok(configDataService.getConfigData(id));
    }

    @PermissionCheck("sys:config-data:page")
    @PostMapping(CONFIG_DATA + "/page")
    public ResBody pageConfigData(@RequestBody ConfigDataVo configDataVo) {
        return ResBody.builder().build().ok(configDataService.pageConfigData(configDataVo.toConfigData()));
    }

    @PermissionCheck("sys:config-value:add")
    @PostMapping(CONFIG_VALUE)
    public ResBody addConfigValue(@RequestBody @Validated({CreateGroup.class}) ConfigValueVo configValueVo) {
        configValueVo.setId(null);
        long result = configApp.addConfigValue(configValueVo.toConfigValue());
        return result > 0 ? ResBody.builder().build().ok() : ResBody.builder().build().fail();
    }

    @PermissionCheck("sys:config-value:del")
    @DeleteMapping(CONFIG_VALUE + "/{id}")
    public ResBody delConfigValue(@PathVariable("id") long id, @RequestBody Object valueContent) {
        Boolean result = configApp.delConfigValue(id, valueContent);
        return result ? ResBody.builder().build().ok() : ResBody.builder().build().fail();
    }

    @PermissionCheck("sys:config-value:update")
    @PutMapping(CONFIG_VALUE)
    public ResBody updateConfigValue(@RequestBody @Validated({UpdateGroup.class}) ConfigValueVo configValueVo) {
        boolean result = configApp.updateConfigValue(configValueVo.toConfigValue());
        return result ? ResBody.builder().build().ok() : ResBody.builder().build().fail();
    }

    @PermissionCheck("sys:config-value:get")
    @GetMapping(CONFIG_VALUE + "/{id}")
    public ResBody getConfigValue(@PathVariable("id") Long id) {
        return ResBody.builder().build().ok(configValueService.getConfigValue(id));
    }

    @PermissionCheck("sys:config-value:page")
    @PostMapping(CONFIG_VALUE + "/page")
    public ResBody pageConfigValue(@RequestBody ConfigValueVo configValueVo) {
        return ResBody.builder().build().ok(configValueService.pageConfigValue(configValueVo.toConfigValue()));
    }

    @PermissionCheck("sys:config-value:rollback")
    @GetMapping(CONFIG_VALUE + "/rollback")
    public ResBody rollbackConfigValueByConfigLog(Long configLogId) {
        Boolean result = configApp.rollbackConfigValueByConfigLog(configLogId);
        return result ? ResBody.builder().build().ok() : ResBody.builder().build().fail();
    }


    @PermissionCheck("sys:config-log:page")
    @PostMapping(CONFIG_LOG + "/page")
    public ResBody pageConfigLog(@RequestBody ConfigLogVo configLogVo) {
        return ResBody.builder().build().ok(configLogService.pageConfigLog(configLogVo.toConfigLog()));
    }

}
